#ifndef xarg_i
    #error "xarg_i missing"
#endif

#define __xstr0(...)     #__VA_ARGS__
#define __xstr1(...)    __xstr0(__VA_ARGS__)

xtest("bits_indexer<" __xstr1(xarg_i) ">"){
    auto && bi          = inc::bits_indexer<xarg_i>{};
    auto    length      = bi.length();
    auto    check = [&](){
        for(uxx i = 0; i < length; i++){
            auto actual     = bi.get(length - i - 1);
            auto wanted     = i;
            xassert_eq(actual, wanted);
        }
    };
    
    check();

    for(uxx i = 0; i < length; i++){
        auto last       = bi.get(length - 1);
        auto pop        = bi.insert(0, last);
        xassert_eq(last, pop);
    }

    check();

    // 测试 insert 接口
    for(uxx i = 0; i < length; i++){
        auto last       = bi.get(length - 1);
        auto pop        = bi.insert(i, last);
        xassert_eq(last, pop, i);
    }

    for(uxx i = 0; i < length; i++){
        auto actual     = bi.get(i);
        auto wanted     = i;
        xassert_eq(actual, wanted, i);
    }

    // 测试 set 接口
    for(uxx i = 0; i < length; i++){
        bi.set(i, length - i - 1);
    }

    check();

    // 测试 remove 接口
    for(uxx i = 0; i < length; i++){
        auto actual     = bi.remove(i);
        auto wanted     = length - i - 1;
        bi.insert(i, actual);
        xassert_eq(actual, wanted);
    }

    check();
};

#undef xarg_i
#undef __xstr0
#undef __xstr1
